#include <unistd.h>
#include <iostream>
#include <signal.h>

void print(sigset_t pending)//打印当前pending位图
{
    std::cout<<"pending:  ";
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&pending, i))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout<<std::endl;
}

void handler(int signo)//二号信号的自定义捕捉函数
{
    std::cout<<"signo:"<<signo<<std::endl;
    sigset_t pending;
    sigemptyset(&pending);
    while (true)
    {
        sleep(1);
        sigpending(&pending);
        print(pending);
    }
}

int main()
{
    std::cout<<getpid()<<std::endl;
    struct sigaction act;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigaddset(&act.sa_mask, 11);
    sigaddset(&act.sa_mask, 15);
    sigaddset(&act.sa_mask, 5);
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);//向阻塞信号集内添加信号

    sigaction(2, &act, nullptr);//修改二号信号的捕捉函数，不需要返回旧的处理方式
    while (1)
    {
        sleep(1);
    }
    return 0;
}